package tools

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
)

// DatasetConfig 数据集配置结构
type DatasetConfig struct {
	// 当前使用的数据集
	CurrentDataset string `json:"current_dataset"`

	// 数据集路径映射
	Datasets map[string]string `json:"datasets"`

	// 默认数据集
	DefaultDataset string `json:"default_dataset"`
}

// 全局配置变量
var globalConfig *DatasetConfig

// getConfigPath 获取配置文件路径
func getConfigPath() string {
	// 优先使用环境变量指定的配置文件路径
	if envPath := os.Getenv("DATASET_CONFIG_PATH"); envPath != "" {
		return envPath
	}

	// 如果都不存在，使用默认路径
	return "../config/dataset_config.json"
}

// getDefaultConfig 获取默认配置
func getDefaultConfig() *DatasetConfig {
	return &DatasetConfig{
		CurrentDataset: "100K",
		DefaultDataset: "100K",
		Datasets: map[string]string{
			"100":    "../datasets/bank_transactions_100.csv",
			"tiny":   "../datasets/bank_transactions_100.csv",
			"1K":     "../datasets/bank_transactions_1K.csv",
			"small":  "../datasets/bank_transactions_1K.csv",
			"10K":    "../datasets/bank_transactions_10K.csv",
			"medium": "../datasets/bank_transactions_10K.csv",
			"100K":   "../datasets/bank_transactions_100K.csv",
			"large":  "../datasets/bank_transactions_100K.csv",
			"1000K":  "../datasets/bank_transactions_1000K.csv",
			"xlarge": "../datasets/bank_transactions_1000K.csv",
		},
	}
}

// loadConfig 加载配置文件
func loadConfig() *DatasetConfig {
	configPath := getConfigPath()

	// 检查文件是否存在
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		// 文件不存在，创建默认配置
		config := getDefaultConfig()
		saveConfig(config)
		return config
	}

	// 读取配置文件
	data, err := os.ReadFile(configPath)
	if err != nil {
		fmt.Printf("警告: 读取配置文件失败，使用默认配置: %v\n", err)
		return getDefaultConfig()
	}

	// 解析JSON
	var config DatasetConfig
	if err := json.Unmarshal(data, &config); err != nil {
		fmt.Printf("警告: 解析配置文件失败，使用默认配置: %v\n", err)
		return getDefaultConfig()
	}

	// 验证配置
	if config.Datasets == nil {
		config.Datasets = getDefaultConfig().Datasets
	}
	if config.CurrentDataset == "" {
		config.CurrentDataset = config.DefaultDataset
	}
	if config.DefaultDataset == "" {
		config.DefaultDataset = "1K"
	}

	// 检查当前数据集是否存在
	if _, exists := config.Datasets[config.CurrentDataset]; !exists {
		fmt.Printf("警告: 当前数据集 '%s' 不存在，使用默认数据集\n", config.CurrentDataset)
		config.CurrentDataset = config.DefaultDataset
	}

	return &config
}

// saveConfig 保存配置文件
func saveConfig(config *DatasetConfig) error {
	configPath := getConfigPath()

	// 确保目录存在
	dir := filepath.Dir(configPath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return fmt.Errorf("创建配置目录失败: %v", err)
	}

	// 序列化配置
	data, err := json.MarshalIndent(config, "", "  ")
	if err != nil {
		return fmt.Errorf("序列化配置失败: %v", err)
	}

	// 写入文件
	if err := os.WriteFile(configPath, data, 0644); err != nil {
		return fmt.Errorf("写入配置文件失败: %v", err)
	}

	return nil
}

// GetDatasetPath 获取当前数据集路径（每次都重新读取配置文件）
func GetDatasetPath() string {
	config := loadConfig() // 每次都重新加载配置

	path, exists := config.Datasets[config.CurrentDataset]
	if !exists {
		fmt.Printf("警告: 数据集 '%s' 不存在，使用默认路径\n", config.CurrentDataset)
		return "datasets/bank_transactions_1K.csv"
	}

	return path
}

// SetCurrentDataset 设置当前数据集
func SetCurrentDataset(dataset string) error {
	config := loadConfig()

	if _, exists := config.Datasets[dataset]; !exists {
		return fmt.Errorf("数据集 '%s' 不存在", dataset)
	}

	config.CurrentDataset = dataset
	fmt.Printf("当前数据集已切换到: %s -> %s\n", dataset, config.Datasets[dataset])

	return saveConfig(config)
}

// GetAvailableDatasets 获取所有可用的数据集
func GetAvailableDatasets() map[string]string {
	config := loadConfig()

	// 返回副本
	result := make(map[string]string)
	for k, v := range config.Datasets {
		result[k] = v
	}

	return result
}

// GetDatasetPathBySize 根据数据集大小获取路径
func GetDatasetPathBySize(size string) string {
	config := loadConfig()

	if path, exists := config.Datasets[size]; exists {
		return path
	}

	// 如果指定大小不存在，返回默认数据集路径
	if defaultPath, exists := config.Datasets[config.DefaultDataset]; exists {
		return defaultPath
	}

	// 最终回退
	return "../datasets/bank_transactions_1K.csv"
}

// GetCurrentDataset 获取当前数据集名称
func GetCurrentDataset() string {
	config := loadConfig()
	return config.CurrentDataset
}
